package com.five.admin.server.impl;



import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.ObjectMetadata;
import com.five.admin.config.AliyunConfig;
import com.five.admin.server.AliyunOssService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@Service
public class AliyunOssServiceImpl implements AliyunOssService {

    // OSS 客户端（懒加载，使用时初始化）
    private static volatile OSS ossClient;

    @Resource
    private  AliyunConfig aliyunConfig;


    private OSS getOssClient() {

        if (ossClient == null) {
            synchronized (this) {
                if (ossClient == null) {
                    ossClient = new OSSClientBuilder().build(
                            aliyunConfig.getEndpoint(),
                            aliyunConfig.getAccessKeyId(),
                            aliyunConfig.getAccessKeySecret()
                    );
                }
            }
        }
        return ossClient;
    }


    /**
     * 上传文件到阿里云 OSS
     *
     * @param file 待上传的本地文件
     * @return 上传后的文件访问 URL
     */
    @Override
    public String uploadFile(File file) {

        // 初始化客户端
        try {
            // 1. 定义 OSS 存储路径（避免文件名冲突，使用 UUID 重命名）
            String originalFileName = file.getName();
            String fileSuffix = originalFileName.substring(originalFileName.lastIndexOf(".")); // 获取文件后缀
            String objectKey = "LIUTAO/" + UUID.randomUUID() + fileSuffix; // 例如：upload/123e4567-e89b-12d3-a456-426614174000.jpg

            // 2. 设置文件元数据（可选，如 Content-Type）
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentLength(file.length());
            // metadata.setContentType(getContentType(fileSuffix)); // 自动识别文件类型

            // 3. 上传文件（流方式上传，避免文件过大占用内存）
            try (FileInputStream inputStream = new FileInputStream(file)) {
                getOssClient().putObject(aliyunConfig.getBucketName(), objectKey, inputStream, metadata);
            }

            // 4. 生成文件访问 URL（公网可访问，需确保 bucket 权限为公共读）
            return "https://" + aliyunConfig.getBucketName() + "." + aliyunConfig.getEndpoint() + "/" + objectKey;

        } catch (IOException e) {
            throw new RuntimeException("文件上传失败：" + e.getMessage(), e);
        }
    }

}
